package com.zenithmind.library.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.zenithmind.common.result.PageResult;
import com.zenithmind.common.result.Result;
import com.zenithmind.library.pojo.domain.Book;
import com.zenithmind.library.pojo.dto.BookCreateDTO;
import com.zenithmind.library.pojo.dto.BookUpdateDTO;
import com.zenithmind.library.pojo.query.BookQuery;
import com.zenithmind.library.pojo.vo.BookDetailVO;
import com.zenithmind.library.pojo.vo.BookVO;

import java.util.List;

/**
 * 图书服务接口
 * 
 * @author ZenithMind
 * @since 2024-06-14
 */
public interface BookService extends IService<Book> {

    /**
     * 分页查询图书
     * 
     * @param query 查询条件
     * @return 分页结果
     */
    PageResult<BookVO> getBookPage(BookQuery query);

    /**
     * 根据ID获取图书详情
     * 
     * @param id 图书ID
     * @return 图书详情
     */
    BookDetailVO getBookDetail(String id);

    /**
     * 创建图书
     * 
     * @param createDTO 创建DTO
     * @return 创建结果
     */
    Result<BookVO> createBook(BookCreateDTO createDTO);

    /**
     * 更新图书
     * 
     * @param id 图书ID
     * @param updateDTO 更新DTO
     * @return 更新结果
     */
    Result<BookVO> updateBook(String id, BookUpdateDTO updateDTO);

    /**
     * 删除图书
     * 
     * @param id 图书ID
     * @return 删除结果
     */
    Result<Void> deleteBook(String id);

    /**
     * 批量删除图书
     * 
     * @param ids 图书ID列表
     * @return 删除结果
     */
    Result<Void> batchDeleteBooks(List<String> ids);

    /**
     * 上架图书
     * 
     * @param id 图书ID
     * @return 操作结果
     */
    Result<Void> publishBook(String id);

    /**
     * 下架图书
     * 
     * @param id 图书ID
     * @return 操作结果
     */
    Result<Void> unpublishBook(String id);

    /**
     * 推荐图书
     * 
     * @param id 图书ID
     * @return 操作结果
     */
    Result<Void> recommendBook(String id);

    /**
     * 取消推荐图书
     * 
     * @param id 图书ID
     * @return 操作结果
     */
    Result<Void> unrecommendBook(String id);

    /**
     * 根据ISBN查询图书
     * 
     * @param isbn ISBN
     * @return 图书信息
     */
    BookVO getBookByIsbn(String isbn);

    /**
     * 根据分类ID查询图书
     * 
     * @param categoryId 分类ID
     * @param query 查询条件
     * @return 分页结果
     */
    PageResult<BookVO> getBooksByCategory(String categoryId, BookQuery query);

    /**
     * 根据作者ID查询图书
     * 
     * @param authorId 作者ID
     * @param query 查询条件
     * @return 分页结果
     */
    PageResult<BookVO> getBooksByAuthor(String authorId, BookQuery query);

    /**
     * 根据出版社ID查询图书
     * 
     * @param publisherId 出版社ID
     * @param query 查询条件
     * @return 分页结果
     */
    PageResult<BookVO> getBooksByPublisher(String publisherId, BookQuery query);

    /**
     * 搜索图书
     * 
     * @param keyword 关键词
     * @param query 查询条件
     * @return 分页结果
     */
    PageResult<BookVO> searchBooks(String keyword, BookQuery query);

    /**
     * 获取推荐图书
     * 
     * @param query 查询条件
     * @return 分页结果
     */
    PageResult<BookVO> getRecommendedBooks(BookQuery query);

    /**
     * 获取新书
     * 
     * @param query 查询条件
     * @return 分页结果
     */
    PageResult<BookVO> getNewBooks(BookQuery query);

    /**
     * 获取热门图书
     * 
     * @param query 查询条件
     * @return 分页结果
     */
    PageResult<BookVO> getPopularBooks(BookQuery query);

    /**
     * 更新图书库存
     * 
     * @param bookId 图书ID
     * @param totalCopies 总库存
     * @param availableCopies 可借阅库存
     * @return 更新结果
     */
    Result<Void> updateBookStock(String bookId, Integer totalCopies, Integer availableCopies);

    /**
     * 增加图书借阅次数
     * 
     * @param bookId 图书ID
     * @return 更新结果
     */
    Result<Void> incrementBorrowCount(String bookId);

    /**
     * 更新图书评分
     * 
     * @param bookId 图书ID
     * @param rating 评分
     * @return 更新结果
     */
    Result<Void> updateBookRating(String bookId, Double rating);

    /**
     * 导入图书数据
     * 
     * @param books 图书列表
     * @return 导入结果
     */
    Result<String> importBooks(List<BookCreateDTO> books);

    /**
     * 导出图书数据
     * 
     * @param query 查询条件
     * @return 导出文件路径
     */
    Result<String> exportBooks(BookQuery query);
}
